import httpRequest from "..";
import { REFRESH_TOKEN_KEY, UNAUTHORIZED_STATUS_CODE, getToken } from "../http/token";

const REFRESH_TOKEN_API = "/refreshtoken";

let promise: Promise<any> | null = null;

/**
 * 获取 refresh token 的接口
 * 这个接口不同于业务接口，它携带的 token 是 refresh token 而不是 access token。
 * 当请求 access token 回来后，就会启动响应拦截将 access token 保存
 * 返回一个 Promise 布尔值，用于判断是否刷新成功，因为 refresh token 也会过期，导致刷新失败。
 * @returns {Promise<boolean>} isRefreshSuccess 刷新 access token 是否成功。
 */
export function refreshAccessToken() {
    // 前面已经发送了刷新请求，promise 有值，此时后续请求全都返回最开始的 promise
    if (promise) {
        return promise;
    }
    promise = new Promise((resolve, rejects) => {
        httpRequest
            .get({
                url: REFRESH_TOKEN_API,
                headers: {
                    Authorization: `Bearer ${getToken(REFRESH_TOKEN_KEY)}`,
                    _isRefreshAccessTokenRequest: true
                }
            })
            .then(res => {
                resolve(res.code !== UNAUTHORIZED_STATUS_CODE);
            })
            .catch(() => rejects(false))
            .finally(() => {
                promise = null; // 本次并发刷新请求结束，重置变量为 null
            });
    });

    return promise;
}
